Extension:	.d00
Version:	4.00 (Player Version)
Created by:	Jens-Christian Huus (JCH/Vibrants)
Tracker:	Edlib Tracker
Players:	Edlib, ...
Description by: JCH/Vibrants
Taken from:	Edlib v1.05a rev 055
Note:		Adlib (OPL2) music format


┌─────────────────────────────────────────────────────────────────────────────┐
│ How to use Player v04.00 ............................ by Jens-Christian Huus│
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│                                                                             │
│       INTRODUCTION                                                          │
│       ────────────                                                          │
│                                                                             │
│       So you have finally managed to fumble you way  around the editor      │
│       and now you want to use the music in your demo or other piece of      │
│       programming not earning you any money (Because THAT's the deal)!      │
│       All right, in this directory you will find the OBJ player needed      │
│       to link onto your own program. This DOC  will tell you about the      │
│       functions and variables in the player plus the file formats.          │
│                                                                             │
│       After having done your tune in the editor - saving the source to      │
│       disk with Shift-F12 or Ctrl-F4 - you must convert it to a format      │
│       with the ".D00" extension. Do this by  pressing Ctrl-F5 while in      │
│       the editor. The music  will be packed to a fully playable format      │
│       which takes up little memory (typically 2-5 Kb). Now you can use      │
│       this file together with "MPLAYER.OBJ" in this directory.              │
│                                                                             │
│       NOTE: You cannot load ".D00" files into EdLib. Make sure you DID      │
│       save that masterpiece with Shift-F12 or Ctrl-F4 before packing!       │
│                                                                             │
│                                                                             │
│       THE TEST PROGRAM                                                      │
│       ────────────────                                                      │
│                                                                             │
│       Before describing the functions in the player, have a look at my      │
│       example file "TEST.ASM" to see how I use the "STR_WISE.D00" file      │
│       by Drax. The source was assembled using Turbo Assembler v4.0 and      │
│       linked using Turbo Link v6.00, both from Borland. You can use my      │
│       makefile "-" to accomplish this, but check it out first - I have      │
│       used the 4DOS command "keystack 13" to  skip the annoying "Press      │
│       any key to continue" message before reentering my source editor.      │
│       I have also  used a "mode co80,50" to switch into 50 lines mode,      │
│       a mode I use a lot when programming.                                  │
│                                                                             │
│       The file "GLOBALS.INC" is included in the source. This file con-      │
│       tains most of the variables in  the player, but in the TEST file      │
│       I only use the "GLOBAL PLAYER:FAR" line to call the player. Some      │
│       of the other  variables will be discussed  later, as they can be      │
│       used to make scopes or the like in your own programs.                 │
│                                                                             │
│       The execution of the "TEST.ASM" file is simple - first it checks      │
│       if an OPL2 chip is present using a function in the player. If it      │
│       isn't, an error is printed and the program is aborted. Otherwise      │
│       the ".D00" is loaded, the player initialized and started. I have      │
│       used a standard timer interrupt routine to call the AdLib player      │
│       as many times as it was used in the  editor (this information is      │
│       saved into the ".D00" file). The source  code has been commented      │
│       all the way, so I guess I don't have to say more than that.           │
│                                                                             │
│                                                                             │
│       PLAYER FUNCTIONS                                                      │
│       ────────────────                                                      │
│                                                                             │
│       Use the "CALL PLAYER" label prepared by "GLOBAL PLAYER:FAR" with      │
│       registers prepared to access all player functions. The player is      │
│       from my old school, so no registers are pushed I'm afraid. Do it      │
│       yourself. Here is a list of the functions currently available in      │
│       this version of the player.                                           │
│                                                                             │
│                                                                             │
│       MAIN RESET      AH      00h                                           │
│                       BX:CX   Segment:offset of ".D00" data #1              │
│                       ES:DI   Segment:offset of ".D00" data #2              │
│                                                                             │
│       Initializes the soundcard, clears variables and resets constants      │
│       as well as informing the player of the location of the tune. The      │
│       ES:DI pair is normally  not of any interest  to you. It was used      │
│       in games  such as "Lollypop" to split up musics and SFX into two      │
│       parts; one for general stuff and one for level-specific stuff.        │
│                                                                             │
│                                                                             │
│       RESET           AH      01h                                           │
│                                                                             │
│       Use this function whenever you want to stop the player. Eg, when      │
│       quitting to DOS and stuff like that. Clears all variables too.        │
│                                                                             │
│                                                                             │
│       START           AH      02h                                           │
│                       BX      Tune number (Usually 0000h)                   │
│                                                                             │
│       Actually starts the tune. In BX more than one piece of music can      │
│       be triggered, something that was useful in games. However, EdLib      │
│       does not know how to pack more than one tune at this moment - so      │
│       I guess you have to tap a 0000h there, no matter what.                │
│                                                                             │
│                                                                             │
│       PLAY            AH      03h                                           │
│                                                                             │
│       This is the function that goes into the timer interrupt or maybe      │
│       the vertical retrace. Whatever. Just as long as you update it as      │
│       many times as  the 8th byte  in the ".D00" file is set to. EdLib      │
│       sets this byte to 70 (46h) as default.                                │
│                                                                             │
│                                                                             │
│       TOGGLE          AH      04h                                           │
│                       BX      Tune number (Usually 0000h)                   │
│                                                                             │
│       Pauses the music instantly. This feature is very useful in games      │
│       when the pause button is pressed. Calling it once more continues      │
│       the music to the best of its abilities; notes falling in quickly      │
│       makes the continuation faultless. But if the notes were long...       │
│                                                                             │
│                                                                             │
│       MAINVOL         AH      05h                                           │
│                       BL      Main volume for part one                      │
│                       BH      Main volume for part two                      │
│                       CL      Dividing line                                 │
│                                                                             │
│       This main volume is a little more complicated than a normal main      │
│       volume routine. Using values of 00h-3Fh  in BL or/and BH you can      │
│       split the main volume up into certain voice parts. Knowing  that      │
│       AdLib has 9 voices, a value of 04h in CL splits up the two reg's      │
│       into  voices 0-3 and 4-8. In  games such  as "Lollypop" this was      │
│       very useful when seperating main volumes for music or SFX, since      │
│       the SFX used voices 0-3 and the music voices 4-8. NOTE: AdLib is      │
│       upside down concerning level (volume) values; use 3Fh as silent.      │
│                                                                             │
│                                                                             │
│       SCAN            AH      06h                                           │
│                                                                             │
│                       CF=0    If the card was detected                      │
│                                                                             │
│       Tries to detect the OPL2 chip (standard AdLib FM chip) using the      │
│       AdLib timer method. If it fails, the carry is set. NOTE: In some      │
│       occasions the detection will fail if there is both a GUS (Gravis      │
│       Ultrasound) and an OPL2 based soundcard in the computer at once.      │
│       It is recommended that you make it possible to override it. Make      │
│       a switch on the commandline or something like that.                   │
│                                                                             │
│                                                                             │
│       BREAK/CONTINUE  AH      07h                                           │
│                       BL=0    Break, otherwise (if BL<>0) continue          │
│                                                                             │
│       This is not a function I can imagine you're ever going to use. I      │
│       made it to make it possible to  break the tune, "remember" where      │
│       it came and start another tune (going into a sublevel). When the      │
│       sublevel was over, this function would then continue on the song      │
│       it "remembered". Since EdLib does not allow more  than one piece      │
│       of music in a ".D00" file, it is not of much use to you! :(           │
│                                                                             │
│                                                                             │
│       REQUEST         AH      08h                                           │
│                       BX      Tune number (Usually 0000h)                   │
│                                                                             │
│                       CF=1    If it is still running                        │
│                                                                             │
│       Simply checks if a tune or SFX ends. Needless to say it requires      │
│       that you use the "FFFExxxx" endmarks in all of the tracks! It is      │
│       not of much use to you, but in games it was worth every penny.        │
│                                                                             │
│                                                                             │
│       PLAYER HEADER VARIABLES                                               │
│       ───────────────────────                                               │
│                                                                             │
│       From offset 0000h in the player I have put certain constants and      │
│       variables at places that will stay the same in every player that      │
│       may be developed for EdLib. These may come in handy if  creating      │
│       some sort of ".D00" shell which loads the player.                     │
│                                                                             │
│                                                                             │
│       Offset          Description                                           │
│       ──────          ───────────                                           │
│                                                                             │
│       0000h-0002h     JMP to all functions which ends with RETF             │
│                                                                             │
│       0003h-0008h     Detection bytes ('JCH',26h,02h,66h)                   │
│                                                                             │
│       0009h-000ah     Current card player version (0400h)                   │
│                                                                             │
│       000bh           Indicates normal OPL2 player (00h)                    │
│                                                                             │
│       000ch           Number of voices supported (09h)                      │
│                                                                             │
│       000dh-002ch     32 bytes card name ('AdLib     ')                     │
│                                                                             │
│       002dh-002eh     Pointer to "Inst" variables                           │
│                                                                             │
│       002fh           Indicates that "Inst" is WORD-based (01h)             │
│                                                                             │
│       0030h-0031h     Pointer to "Dur" variables                            │
│                                                                             │
│       0032h           Indicates that "Dur" is WORD-based (01h)              │
│                                                                             │
│       0033h-0034h     Pointer to "SeqPoi" variables                         │
│                                                                             │
│       0035h           Indicates that "SeqPoi" is WORD-based (01h)           │
│                                                                             │
│       0036h-0037h     Pointer to "TrackPoi" variables                       │
│                                                                             │
│       0038h           Indicates that "TrackPoi" is WORD-based (01h)         │
│                                                                             │
│       0039h-003ah     Pointer to "Freq" variables                           │
│                                                                             │
│       003bh           Indicates that "Freq" is WORD-based (01h)             │
│                                                                             │
│       003ch-003dh     Pointer to "Spedr" variables                          │
│                                                                             │
│       003eh           Indicates that "Spedr" is BYTE-based (00h)            │
│                                                                             │
│       003fh-0040h     Pointer to "Gate" variables                           │
│                                                                             │
│       0041h           Indicates that "Gate" is BYTE-based (00h)             │
│                                                                             │
│       0042h-0043h     Pointer to "Nog" variables                            │
│                                                                             │
│       0044h           Indicates that "Nog" is BYTE-based (00h)              │
│                                                                             │
│       0045h-0046h     Pointer to "Note" variables                           │
│                                                                             │
│       0047h           Indicates that "Note" is BYTE-based (00h)             │
│                                                                             │
│       0048h-0067h     32 bytes reserved for future expansion                │
│                                                                             │
│       0068h-0070h     ON/OFF flags for all 9 voices (00h=Off)               │
│                                                                             │
│       0071h-????h     Copyright string, and rest of player                  │
│                                                                             │
│                                                                             │
│       Some notes about the information above may be necessary.              │
│                                                                             │
│       The JMP at position 0000h makes it  possible to turn  the player      │
│       into a BIN-file and just call the player from offset 0000h.           │
│                                                                             │
│       You may wonder about the detection bytes. The 'JCH' is of course      │
│       my initials. 26h,02h,66h is my birthdate; 26th of february 1966.      │
│                                                                             │
│       Offset 000bh-002ch was made to identify this player from players      │
│       written for other soundcards. I soon burried this idea.               │
│                                                                             │
│       All the variables pointers each points to nine bytes or words in      │
│       which you may find valuable information for shell programs. Here      │
│       is a deeper explanation of these variables...                         │
│                                                                             │
│                                                                             │
│       "Inst"          9 WORDS         Current instrument played             │
│                                                                             │
│       "Dur"           9 WORDS         Realtime note duration counters       │
│                                                                             │
│       "SeqPoi"        9 WORDS         Realtime sequence position            │
│                                                                             │
│       "TrackPoi"      9 WORDS         Realtime track position               │
│                                                                             │
│       "Freq"          9 WORDS         Actual raw frequency played           │
│                                                                             │
│       "Spedr"         9 BYTES         Current speed of the tune             │
│                                                                             │
│       "Gate"          9 BYTES         Key ON/OFF flags (+++/---)            │
│                                                                             │
│       "Nog"           9 BYTES         Tienote indicator flags               │
│                                                                             │
│       "Note"          9 BYTES         Current note including transp.        │
│                                                                             │
│                                                                             │
│       Note that the variables offered in the header of the player will      │
│       also be available though the "GlOBALS.INC" file when linking. It      │
│       is recommended that you fetch the variables that way if you only      │
│       plan on LINKING with the player.                                      │
│                                                                             │
│       There are more variables in the "GLOBALS.INC" file, but since it      │
│       is beyond the scope of this DOC to describe them I will leave it      │
│       up to you if you want to figure them all out! ;)                      │
│                                                                             │
│                                                                             │
│       THE ".D00" FORMAT                                                     │
│       ─────────────────                                                     │
│                                                                             │
│       Here comes an extensive description of the ".D00" files. With it      │
│       you can make support for ".D00" files in your commandline player      │
│       if you're working on such a program.                                  │
│                                                                             │
│                                                                             │
│       Offset          Description                                           │
│       ──────          ───────────                                           │
│                                                                             │
│       0000h-0005h     Detection bytes ('JCH',26h,02h,66h)                   │
│                                                                             │
│       0006h           Block type (00h for music data)                       │
│                                                                             │
│       0007h           Player version required (Usually 04h)                 │
│                                                                             │
│       0008h           Timer speed for the block (Usually 46h)               │
│                                                                             │
│       0009h           Number of music and SFX (Usually 01h)                 │
│                                                                             │
│       000ah           Soundcard (Usually 00h for AdLib)                     │
│                                                                             │
│       000bh-002ah     32 bytes name of the music                            │
│                                                                             │
│       002bh-004ah     32 bytes name of composer                             │
│                                                                             │
│       004bh-006ah     32 bytes reserved for future expansion                │
│                                                                             │
│       006bh-006ch     Pointer to "Tpoin" tables                             │
│                                                                             │
│       006dh-006eh     Pointer to "SeqPointer" tables                        │
│                                                                             │
│       006fh-0070h     Pointer to "Instrument" tables                        │
│                                                                             │
│       0071h-0072h     Pointer to "DataInfo" text                            │
│                                                                             │
│       0073h-0074h     Pointer to "Special" tables (SpFX)                    │
│                                                                             │
│       0075h           Endmark (FFFFh)                                       │
│                                                                             │
│                                                                             │
│       Again, some notes about the information above may be necessary.       │
│                                                                             │
│       Offset 0006h is always 00h. It was made to tell music data apart      │
│       from sample data. EdLib of course always sets this to 00h.            │
│                                                                             │
│       Some years ago I spread some old ".D00" music files which I made      │
│       in old AdLib players (v02.00 and below). Some of  this music may      │
│       not sound too good in player v04.00. Check if this byte contains      │
│       04h. If it doesn't, you better avoid playing it.                      │
│                                                                             │
│       When using the AdLib player you should always check offset 0008h      │
│       to see how many times a second the player should be called.           │
│                                                                             │
│       EdLib always sets offset 0009h to 01h. You cannot make more than      │
│       one piece of music at a time in the editor.                           │
│                                                                             │
│       Offset 000ah is always set to 00h in EdLib. If you encounter any      │
│       strange ".D00" files containing any other value you better avoid      │
│       playing it.                                                           │
│                                                                             │
│       Even though the ".D00" format allows 32 bytes for both the music      │
│       name and the composer name, EdLib only accepts 20 characters.         │
│                                                                             │
│       The pointers to various tables is really  not of any interest to      │
│       you, except "DataInfo" which in old songs occasionally contained      │
│       additional text about the song. Tables  such as "Instrument" may      │
│       be useful to know in case you want to edit the ".D00" file! ;)        │
│                                                                             │
│                                                                             │
│       LAST WORDS                                                            │
│       ──────────                                                            │
│                                                                             │
│       You may wonder why it takes so much  time to play a pesky little      │
│       AdLib tune. After all, the player is not mixing like MOD players      │
│       so what the hell is going on here? Bad programming? No!! It is a      │
│       sad fact but true nonetheless; When outputting a value to the FM      │
│       chip like OPL2 I must wait 6 "IN" instructions after the reg has      │
│       been output, and 35 (!) "IN" instructions after the value itself      │
│       has been sent. If I try to decrease the  number of instructions,      │
│       some computers begins to play wrong; notes start falling out and      │
│       play false. There ARE alternatives to using the "IN" method, one      │
│       of the  best is to use the "timer tick" method - but there is an      │
│       even better method.                                                   │
│                                                                             │
│       One of my friends who is working on an editor for OPL3 (the four      │
│       operator chip on SB Pro II and SB 16 to mention a few) found out      │
│       that this chip has been optimized so much, that instead of 6 and      │
│       35 "IN's" it only requires 1 and 0 "IN's" !! I tried it on quite      │
│       a lot of computers, it actually works! If the OPL3 exists it may      │
│       play well in OPL2 mode with  a very small CPU usage. In fact, it      │
│       takes as little time as a native GUS player! :)                       │
│                                                                             │
│       Only one problem arises however. I have not made a detection for      │
│       the OPL3 chip. I haven't  even  tried to, but if I find a way to      │
│       do it, I may very well implement it in the next player update. I      │
│       need some response on this however. If you think AdLib sucks and      │
│       it doesn't make any difference, well - TUFF!                          │
│                                                                             │
│       If you want to contact me, look in the DOC file for EdLib itself      │
│       for a snail mail or FidoNet address.                                  │
│                                                                             │
│       This OBJ and the editor is freeware and may  be used in programs      │
│       that does not earn  you any money, for free. If you  are working      │
│       on one of those commandline players for MOD, S3M, MTM  (you name      │
│       it), why not  make  support for the ".D00" format?  After all, I      │
│       have done most of the work for you already! :)                        │
│                                                                             │
│                                                                             │
│       THE BORING STUFF                                                      │
│       ────────────────                                                      │
│                                                                             │
│       All files in the archive should be distributed in their original      │
│       form - it is forbidden to modify anything. The player may not be      │
│       used commercially in any way without permission from the author.      │
│                                                                             │
│       The names Vibrants, the SirFace System and EdLib  are trademarks      │
│       of Jens-Christian Huus. Other product and  company names are the      │
│       trademarks of their respective owners.                                │
│                                                                             │
│       All warranties are disclaimed, including damage to your hardware      │
│       and/or software from use of this product.  In no event will I be      │
│       liable to you for any damages - including any lost profits, lost      │
│       savings or other incidental or consequential damages arising out      │
│       of your use or inability to use the  program, or any other claim      │
│       by any other party.                                                   │
│                                                                             │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘